package designPattern.command.undoCommand
{
	import designPattern.command.macroCommand.Invoker;
	
	import flash.display.Stage;
	import flash.text.TextField;

	public class UndoCommandMainClass
	{
		/**
		 *概述：
		 * 命令模式将行为内置在命令中。通过调用命令对象中的execute()方法执行命令。执行命令是委派的是什么
		 * 类，实现行为时使用的是哪个方法对客户端来说都是透明的。降低了任务发起者和任务实现者代码耦合。
		 * 单个命令对象可以有多个命令发起者共享。例如，命令对象的某个实例可以被应用程序中的多个不同代码
		 * 共享使用。这使得扩展或修改命令中的行为变得简单。
		 * 可以在运行时动态的将命令对象赋值给任务发起者，这样可以根据应用程序的变化得到不同的执行结果。
		 * 这在根据环境不断变化的应用程序时非常有用。
		 *命令模式的主要特征：
		 * #命令模式在一个简单的命令对象中封装行为
		 * #减少了调用行为的类及执行行为的类之间的耦合
		 * #允许客户端运行中动态通过创建新命令对象从而执行新的行为，并将按新的行为指派给发起者invoker
		 * #可以实现应用程序的命令链(宏命令)、恢复、重做和日志特征 
		 *
		 *本例为实现重做
		 */	
		public function UndoCommandMainClass(root:Stage)
		{
			var myText:TextField = new TextField();
			myText.text = "100";
			root.addChild(myText);
			myText.x = 130;
			myText.y = 20;
			
			var invokerPanel:InvokerPanel = new InvokerPanel();
			root.addChild(invokerPanel);
			
			var inCom:CommandWithUndo = new IncrementCommandWithUndo(myText);
			var deCom:CommandWithUndo = new DecrementCommandWithUndo(myText);
			var unCom:CommandWithUndo = new UndoCommand(); 
			
			invokerPanel.setCommandBtn(0, "+", inCom);
			invokerPanel.setCommandBtn(1, "-", deCom);
			invokerPanel.setCommandBtn(2, "u", unCom);
		}
	}
}